#pragma once

#include "socket.h"

using func_t = function<string(string &)>; // 执行任务的方法

// Http底层是采用tcp协议
class Tcp_server
{
public:
    Tcp_server(uint16_t port, func_t f)
        : _port(port), _sv(new tcp_socket()), _func(f)
    {
        _sv->tcpserver_socket(port); // 创建套接字，且绑定病监听
    }

    void thread_run(my_socket *socket) // 服务端与客户端建立连接后，服务端的一个子线程与客户端进行通信
    {
        string Http_request;
        // 1.读取客户端发送的数据，存到Http_request中（并不能保证读取的是一个完整报文，需要流式分析）
        socket->Recv(Http_request, 10240);

        // 2.回调，执行服务端提供的处理方法，并返回处理结果
        string Http_response = _func(Http_request);

        // 3.将执行后的数据返回发送给客户端（浏览器）
        socket->Send(Http_response);

        socket->Close();
    }

    void loop()
    {
        while (1)
        {
            string client_ip;
            uint16_t client_port;
            my_socket *socket = _sv->Accept(client_ip, client_port); // 接收套接字
            cout << "获取新连接,ip= " << client_ip << " port= " << client_port << endl;

            // sleep(3);
            // _sv->Close();//监听套接字就是用来接收多个客户端的连接

            // 创建线程执行任务
            thread t(std::bind(&Tcp_server::thread_run, this, placeholders::_1), socket);
            t.detach(); // 线程分离
            // t.join();
        }
    }

    ~Tcp_server()
    {
        delete _sv;
    }

private:
    my_socket *_sv;
    uint16_t _port;
    func_t _func;
};
